import $ from 'jquery'
//const klc_host="localhost:9088"
//const jdbc_url = `http://${klc_host}/baas/mydata/jdbc`; // 本地的 imtdata 的数据库连接url
const jdbc_url = `http://www.yichem365.com/widget/api/baas/imtdata/jdbc`; // yichem365 上的 imtdata 的数据库连接url
const monadjs= require("./monad");// CPS 风格的monad

/**
 * 数据库请求 
 * @param {*} sql sql 语句
 * @param {*} url 数据库连接url 
 */
function sqlquery(sql,url){
	console.log(sql);
	return new Promise((reslove,reject)=>{
		$.ajax({
			url:url,
			data:{sql:sql},
			method:"post",
			success:reslove,
			failure:reject
		})
	});
}

/**
 * monad 调用的jdbc sql 语句:monad 所呈递的数据对象为{error,result,fields} 即 connection.query 所返回的结果
 * @param {*} result_preprocessor 结果预处理器对 {error,result,fields} 进行处理并 交给 monad 进行呈递。
 * @param {*} error_handler 错误处理器
 * @param {*} sql sql 语句
 */
const jdbc2monad = function(result_preprocessor,error_handler=console.log){
    //  时刻需要注意，js 对于this 是根据调用清醒进行动态绑定的。
    // funciton(sql)中的this(默认指向global) 与这里的 self/this(指向调用jdbcmonad的函数) 是不一样的，
    // 需要给与统一 即统一的调整到 调用self 的对象.
    const self = this; // 对象句柄:用于集中归类函数到一个对象之中
    return function(sql){
        const m = monadjs.Monad();
        sqlquery.call(self, sql,jdbc_url)
        .then(data=>{
            monadjs.detonate(result_preprocessor({error:data.error,result:data.result,fields:data.fields}))(m);
        },data=>{
            error_handler(data);
        }).exc;
        return m;
    }// function(sql)
}// jdbc2monad

/**
 * monad 调用的jdbc sql 语句
 * @param {*} result_preprocessor 结果预处理器 
 * @param {*} error_handler 错误处理器
 * @param {*} sql sql 语句
 */
const m_jdbc2one = function (sql,error_handler){
    const sqlexecute = jdbc2monad.call(this,e => {
            if(e.err || !e.result || e.result.length<1) {
                return null;// 返回空值
            }else{
                return e.result[0]// 返回第一个结果元素
            }//if
        }, error_handler);
    return sqlexecute(sql);// 执行sql语句
}

/**
 * monad 调用的jdbc sql 语句
 * @param {*} result_preprocessor 结果预处理器 
 * @param {*} error_handler 错误处理器
 * @param {*} sql sql 语句
 */
const m_jdbc2many = function (sql,reject){
    const sqlexecute = jdbc2monad.call(this,e => e.result,error_handler);
    return sqlexecute(sql);// 执行sql语句
}

exports.sqlquery = sqlquery;
exports.jdbc_url = jdbc_url;
exports.jdbc2monad = jdbc2monad;
exports.m_jdbc2many = m_jdbc2many;
exports.m_jdbc2one= m_jdbc2one;